package com.dl.dlcommon.utils.result;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

/**
 * 自定义返回信息
 * @author DL
 * @create 2022-03-19 11:16
 */
@Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public final class Result<T> {

    /**
     * 响应结果
     */
    private boolean status;

    /**
     * 响应码
     */
    private Integer code;

    /**
     * 数据
     */
    private T data;

    // 把构造方法私有，不让外部new
    private Result() {
    }

    /**
     * 返回模版
     *
     * @param status  状态
     * @param code    代码
     * @param data 消息
     * @return {@link Result }
     * @author DL
     * @date 2023/01/13
     */
    private static <T> Result<?> template(boolean status, Integer code, T data) {
        Result<T> result = new Result<>();
        result.setStatus(status);
        result.setCode(code);
        result.setData(data);
        return result;
    }

    /**
     * 返回简单成功信息
     *
     * @return {@link Result }
     * @author DL
     * @date 2023/01/13
     */
    public static <T> Result<?> ok(ResultCodeEnum resultCodeEnum) {
        return template(resultCodeEnum.getSuccess(), resultCodeEnum.getCode(), resultCodeEnum.getData());
    }

    /**
     * 返回简单成功信息
     *
     * @return {@link Result }
     * @author DL
     * @date 2023/01/13
     */
    public static <T> Result<?> ok() {
        return template(true, ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getData());
    }

    /**
     * 返回简单成功信息
     * @return 统一返回格式
     */
    public static <T> Result<?> ok(T data) {
        return template(true, ResultCodeEnum.SUCCESS.getCode(), data);
    }

    /**
     * 返回简单错误信息
     * @return 统一返回格式
     */
    public static <T> Result<?> no(String data) {
        return template(false, ResultCodeEnum.SUCCESS.getCode(), data);
    }

    /**
     * 返回自定义成功信息
     * @param data 消息
     * @return 统一返回格式
     */
    public static <T> Result<?> success(String data) {
        return template(true, ResultCodeEnum.SUCCESS.getCode(), data);
    }

    /**
     * 返回自定义成功信息
     * @param code 状态码
     * @param data 消息
     * @return 统一返回格式
     */
    public static <T> Result<?> success(Integer code, String data) {
        return template(true, code, data);
    }

    /**
     * 返回自定义失败信息
     * @param data 消息
     * @return 统一返回格式
     */
    public static <T> Result<?> error(String data) {
        return template(false, 500, data);
    }

    /**
     * 返回自定义失败信息
     * @param code 状态码
     * @param data 消息
     * @return 统一返回格式
     */
    public static <T> Result<?> error(Integer code, String data) {
        return template(false, code, data);
    }

}

